# coding=utf-8
# TODO 用于注册参数的效验和保存
import re
from flask import current_app
from flask import json
from flask import request, jsonify
from flask import session

from iHome import redis_store, db
from iHome.api_1_0 import api
from iHome.models import User
from iHome.utils.commons import login_required
from iHome.utils.response_code import RET


@api.route('/register', methods=['POST', 'GET'])
def check_from_register():
    """注册逻辑"""
    # 1.获取参数 手机号， 手机短信验证码， 密码
    dict_data = request.get_json()
    mobile = dict_data.get('mobile')
    phonecode = dict_data.get('phonecode')
    password = dict_data.get('password')
    # 2.效验参数
    if not all([mobile, phonecode, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不正确')

    # 3.从redis中获取real的验证码
    try:
        real_mobile = redis_store.get('SMSCode_' + mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=' 查询数据库失败')

    if not real_mobile:
        return jsonify(errno=RET.DATAERR, errmsg='手机验证码过期')

    if real_mobile != phonecode:
        return jsonify(errno=RET.NODATA, errmsg='验证失败')

    # 4.初始化user类
    user = User()
    user.mobile = mobile
    user.name = mobile
    # 保存密码
    user.password = password
    # 5.保存数据到数据库中
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存到数据库失败')
    # 缓存到session
    session['user_id'] = user.id
    session['mobile'] = mobile
    session['name'] = mobile

    # 6.返回响应
    return jsonify(errno=RET.OK, errmsg='注册成功')


@api.route("/login", methods=["GET"])
def check_login():
    """检查登陆状态"""
    # 尝试从session中获取用户的名字
    name = session.get("name")
    print 'name', name
    # 如果session中数据name名字存在，则表示用户已登录，否则未登录
    if name is not None:
        return jsonify(errno=RET.OK, errmsg="true", data={"name": name})
    else:
        return jsonify(errno=RET.SESSIONERR, errmsg="false")


@api.route('/login', methods=["POST"])
def login():
    # 登陆逻辑

    # 获取参数
    # dict_data = request.get_json()
    dict_data = request.json
    # json_data = request.data()
    # dict_data = json.loads(json_data)

    print type(dict_data)
    mobile = dict_data.get('mobile')
    password = dict_data.get('password')
    # 验证参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')

    if not re.match(r'^1([358][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$', mobile):
        return jsonify(errno=RET.NODATA, errmsg='手机格式输入错误')
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)

    if user is None:
        return jsonify(errno=RET.DBERR, errmsg='该用户没有注册')
    # 从数据库中取到对应的数据，判断是否正确
    # 效验密码，因为密码在数据库中是密文保存的，所以在models中定义check_password
    if not user.check_password(password):
        return jsonify(errno=RET.DATAERR, errmsg='账号或者密码错误')
    print 1234
    session['user_id'] = user.id
    session['name'] = user.name
    session['mobile'] = user.mobile
    print session['mobile']

    # 保存到redis中
    return jsonify(errno=RET.OK, errmsg='登陆成功')
    # 返回响应


@api.route('/login', methods=["DELETE"])
@login_required
def logout():
    """登出"""
    # 清除session数据, csrf_token需要保留.
    csrf_token = session['csrf_token']
    session.clear()
    session['csrf_token'] = csrf_token
    return jsonify(errno=RET.OK, errmsg="OK")
